home *** CD-ROM | disk | FTP | other *** search
/ Freelog 115 / FreelogNo115-MaiJuin2013.iso / Internet / Filezilla Server / FileZilla_Server-0_9_41.exe / source / interface / GroupsDlgSharedFolders.cpp < prev    next >
C/C++ Source or Header  |  2011-11-06  |  19KB  |  641 lines

  1. // FileZilla Server - a Windows ftp server
  2.  
  3. // Copyright (C) 2002-2004 - Tim Kosse <tim.kosse@gmx.de>
  4.  
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the GNU General Public License
  7. // as published by the Free Software Foundation; either version 2
  8. // of the License, or (at your option) any later version.
  9.  
  10. // This program is distributed in the hope that it will be useful,
  11. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. // GNU General Public License for more details.
  14.  
  15. // You should have received a copy of the GNU General Public License
  16. // along with this program; if not, write to the Free Software
  17. // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  18.  
  19. // GroupsDlg.cpp: Implementierungsdatei
  20. //
  21.  
  22. #include "stdafx.h"
  23. #include "FileZilla server.h"
  24. #include "GroupsDlgSharedFolders.h"
  25. #include "GroupsDlg.h"
  26. #include "misc\sbdestination.h"
  27. #include "entersomething.h"
  28.  
  29. #if defined(_DEBUG) && !defined(MMGR)
  30. #define new DEBUG_NEW
  31. #undef THIS_FILE
  32. static char THIS_FILE[] = __FILE__;
  33. #endif
  34.  
  35. /////////////////////////////////////////////////////////////////////////////
  36. // Dialogfeld CGroupsDlgSharedFolders 
  37.  
  38. CGroupsDlgSharedFolders::CGroupsDlgSharedFolders(CGroupsDlg *pOwner)
  39.     : CSAPrefsSubDlg(CGroupsDlgSharedFolders::IDD)
  40. {
  41.     ASSERT(pOwner);
  42.     m_pOwner = pOwner;
  43.     
  44.     //{{AFX_DATA_INIT(CGroupsDlgSharedFolders)
  45.     m_bDirsCreate = FALSE;
  46.     m_bDirsDelete = FALSE;
  47.     m_bDirsList = FALSE;
  48.     m_bDirsSubdirs = FALSE;
  49.     m_bFilesAppend = FALSE;
  50.     m_bFilesDelete = FALSE;
  51.     m_bFilesRead = FALSE;
  52.     m_bFilesWrite = FALSE;
  53.     m_bAutoCreate = FALSE;
  54.     //}}AFX_DATA_INIT
  55. }
  56.  
  57. CGroupsDlgSharedFolders::~CGroupsDlgSharedFolders()
  58. {
  59. }
  60.  
  61.  
  62. void CGroupsDlgSharedFolders::DoDataExchange(CDataExchange* pDX)
  63. {
  64.     CSAPrefsSubDlg::DoDataExchange(pDX);
  65.     //{{AFX_DATA_MAP(CGroupsDlgSharedFolders)
  66.     DDX_Control(pDX, IDC_DIRS_CREATE, m_cDirsCreate);
  67.     DDX_Control(pDX, IDC_DIRS_DELETE, m_cDirsDelete);
  68.     DDX_Control(pDX, IDC_DIRS_LIST, m_cDirsList);
  69.     DDX_Control(pDX, IDC_DIRS_SUBDIRS, m_cDirsSubdirs);
  70.     DDX_Control(pDX, IDC_FILES_READ, m_cFilesRead);
  71.     DDX_Control(pDX, IDC_FILES_WRITE, m_cFilesWrite);
  72.     DDX_Control(pDX, IDC_FILES_DELETE, m_cFilesDelete);
  73.     DDX_Control(pDX, IDC_FILES_APPEND, m_cFilesAppend);
  74.     DDX_Control(pDX, IDC_GROUPS_AUTOCREATE, m_cAutoCreate);
  75.     DDX_Control(pDX, IDC_DIRS, m_cDirs);
  76.     DDX_Check(pDX, IDC_DIRS_CREATE, m_bDirsCreate);
  77.     DDX_Check(pDX, IDC_DIRS_DELETE, m_bDirsDelete);
  78.     DDX_Check(pDX, IDC_DIRS_LIST, m_bDirsList);
  79.     DDX_Check(pDX, IDC_DIRS_SUBDIRS, m_bDirsSubdirs);
  80.     DDX_Check(pDX, IDC_FILES_APPEND, m_bFilesAppend);
  81.     DDX_Check(pDX, IDC_FILES_DELETE, m_bFilesDelete);
  82.     DDX_Check(pDX, IDC_FILES_READ, m_bFilesRead);
  83.     DDX_Check(pDX, IDC_FILES_WRITE, m_bFilesWrite);
  84.     DDX_Check(pDX, IDC_GROUPS_AUTOCREATE, m_bAutoCreate);
  85.     //}}AFX_DATA_MAP
  86. }
  87.  
  88.  
  89. BEGIN_MESSAGE_MAP(CGroupsDlgSharedFolders, CSAPrefsSubDlg)
  90.     //{{AFX_MSG_MAP(CGroupsDlgSharedFolders)
  91.     ON_WM_CONTEXTMENU()
  92.     ON_NOTIFY(LVN_ITEMCHANGED, IDC_DIRS, OnItemchangedDirs)
  93.     ON_NOTIFY(LVN_ITEMCHANGING, IDC_DIRS, OnItemchangingDirs)
  94.     ON_COMMAND(ID_DIRMENU_ADD, OnDirmenuAdd)
  95.     ON_COMMAND(ID_DIRMENU_REMOVE, OnDirmenuRemove)
  96.     ON_COMMAND(ID_DIRMENU_RENAME, OnDirmenuRename)
  97.     ON_COMMAND(ID_DIRMENU_SETASHOMEDIR, OnDirmenuSetashomedir)
  98.     ON_COMMAND(ID_DIRMENU_EDITALIASES, OnDirmenuEditAliases)
  99.     ON_NOTIFY(LVN_ENDLABELEDIT, IDC_DIRS, OnEndlabeleditDirs)
  100.     ON_NOTIFY(NM_DBLCLK, IDC_DIRS, OnDblclkDirs)
  101.     ON_BN_CLICKED(IDC_FILES_WRITE, OnFilesWrite)
  102.     ON_BN_CLICKED(IDC_DIRADD, OnDiradd)
  103.     ON_BN_CLICKED(IDC_DIRREMOVE, OnDirremove)
  104.     ON_BN_CLICKED(IDC_DIRRENAME, OnDirrename)
  105.     ON_BN_CLICKED(IDC_DIRSETASHOME, OnDirsetashome)
  106.     //}}AFX_MSG_MAP
  107. END_MESSAGE_MAP()
  108.  
  109. /////////////////////////////////////////////////////////////////////////////
  110. // Behandlungsroutinen fⁿr Nachrichten CGroupsDlgSharedFolders 
  111.  
  112. BOOL CGroupsDlgSharedFolders::OnInitDialog() 
  113. {
  114.     CSAPrefsSubDlg::OnInitDialog();
  115.     
  116.     m_cDirs.InsertColumn(0, _T("Directories"), LVCFMT_LEFT, 120);
  117.     m_cDirs.InsertColumn(1, _T("Aliases"), LVCFMT_LEFT, 200);
  118.     UpdateData(FALSE);
  119.     
  120.     m_imagelist.Create(16, 16, ILC_MASK, 3, 3);
  121.     HICON icon;
  122.     icon = AfxGetApp()->LoadIcon(IDI_EMPTY);
  123.     m_imagelist.Add(icon);
  124.     DestroyIcon(icon);
  125.     icon = AfxGetApp()->LoadIcon(IDI_HOME);
  126.     m_imagelist.Add(icon);
  127.     DestroyIcon(icon);
  128.     
  129.     m_cDirs.SetImageList(&m_imagelist, LVSIL_SMALL);
  130.  
  131.     m_cDirs.SetExtendedStyle(LVS_EX_FULLROWSELECT);
  132.             
  133.     SetCtrlState();
  134.  
  135.     return TRUE;  // return TRUE unless you set the focus to a control
  136.                   // EXCEPTION: OCX-Propertypages should return FALSE
  137. }
  138.  
  139. CString CGroupsDlgSharedFolders::Validate()
  140. {
  141.     //TODO: check for homedir
  142.     
  143.     UpdateData(TRUE);
  144.     t_group *pGroup = m_pOwner->GetCurrentGroup();
  145.     if (!pGroup)
  146.         return _T("");
  147.  
  148.     for (std::vector<t_directory>::iterator iter = pGroup->permissions.begin(); iter != pGroup->permissions.end(); iter++)
  149.     {
  150.         if (iter->dir == _T("") || iter->dir == _T("/") || iter->dir == _T("\\"))
  151.         {
  152.             m_cDirs.SetFocus();
  153.             return _T("At least one shared directory is not a valid local path.");
  154.         }
  155.  
  156.         if (iter->bIsHome)
  157.             iter->aliases.clear();
  158.     }
  159.     
  160.     return _T("");
  161. }
  162.  
  163. void CGroupsDlgSharedFolders::OnContextMenu(CWnd* pWnd, CPoint point) 
  164. {
  165.     if (pWnd == &m_cDirs)
  166.     {
  167.         CMenu menu;
  168.         menu.LoadMenu(IDR_DIRCONTEXT);
  169.  
  170.         CMenu* pPopup = menu.GetSubMenu(0);
  171.         ASSERT(pPopup != NULL);
  172.         CWnd* pWndPopupOwner = this;
  173.         
  174.         if (!m_cDirs.GetFirstSelectedItemPosition())
  175.         {
  176.             pPopup->EnableMenuItem(ID_DIRMENU_REMOVE, MF_GRAYED);
  177.             pPopup->EnableMenuItem(ID_DIRMENU_RENAME, MF_GRAYED);
  178.             pPopup->EnableMenuItem(ID_DIRMENU_SETASHOMEDIR, MF_GRAYED);
  179.             pPopup->EnableMenuItem(ID_DIRMENU_EDITALIASES, MF_GRAYED);
  180.         }
  181.         if (point.x == -1)
  182.             GetCursorPos(&point);
  183.         pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
  184.             pWndPopupOwner);
  185.     }
  186. }
  187.  
  188. void CGroupsDlgSharedFolders::OnItemchangedDirs(NMHDR* pNMHDR, LRESULT* pResult) 
  189. {
  190.     NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
  191.     
  192.     t_group *pGroup = m_pOwner->GetCurrentGroup();
  193.     if (!pGroup)
  194.         return;
  195.     
  196.     int nItem = pNMListView->iItem;
  197.     POSITION selpos = m_cDirs.GetFirstSelectedItemPosition();
  198.     if (selpos)
  199.     {
  200.         if (m_cDirs.GetNextSelectedItem(selpos)!=nItem)
  201.             return;
  202.     }
  203.     int index = pNMListView->lParam;
  204.     if (nItem != -1)
  205.     {
  206.         m_bFilesRead = pGroup->permissions[index].bFileRead;
  207.         m_bFilesWrite = pGroup->permissions[index].bFileWrite;
  208.         m_bFilesDelete = pGroup->permissions[index].bFileDelete;
  209.         m_bFilesAppend = pGroup->permissions[index].bFileAppend;
  210.         m_bDirsCreate = pGroup->permissions[index].bDirCreate;
  211.         m_bDirsDelete = pGroup->permissions[index].bDirDelete;
  212.         m_bDirsList = pGroup->permissions[index].bDirList;
  213.         m_bDirsSubdirs = pGroup->permissions[index].bDirSubdirs;
  214.         m_bAutoCreate = pGroup->permissions[index].bAutoCreate;
  215.     }
  216.     UpdateData(FALSE);
  217.  
  218.     SetCtrlState();    
  219.     *pResult = 0;
  220. }
  221.  
  222. void CGroupsDlgSharedFolders::OnItemchangingDirs(NMHDR* pNMHDR, LRESULT* pResult) 
  223. {
  224.     *pResult = 0;
  225.     UpdateData(TRUE);
  226.  
  227.     t_group *pGroup = m_pOwner->GetCurrentGroup();
  228.     if (!pGroup)
  229.         return;
  230.  
  231.         
  232.     POSITION selpos = m_cDirs.GetFirstSelectedItemPosition();
  233.     if (selpos)
  234.     {
  235.         int item = m_cDirs.GetNextSelectedItem(selpos);
  236.         int index = m_cDirs.GetItemData(item);
  237.         pGroup->permissions[index].bFileRead = m_bFilesRead;
  238.         pGroup->permissions[index].bFileWrite = m_bFilesWrite;
  239.         pGroup->permissions[index].bFileDelete = m_bFilesDelete;
  240.         pGroup->permissions[index].bFileAppend = m_bFilesAppend;
  241.         pGroup->permissions[index].bDirCreate = m_bDirsCreate;
  242.         pGroup->permissions[index].bDirDelete = m_bDirsDelete;
  243.         pGroup->permissions[index].bDirList = m_bDirsList;
  244.         pGroup->permissions[index].bDirSubdirs = m_bDirsSubdirs;
  245.         pGroup->permissions[index].bAutoCreate = m_bAutoCreate;
  246.     }
  247. }
  248.  
  249. void CGroupsDlgSharedFolders::SetCtrlState()
  250. {
  251.     t_group *pGroup = m_pOwner->GetCurrentGroup();
  252.     if (!pGroup)
  253.     {
  254.         m_cDirs.EnableWindow(FALSE);
  255.         m_cFilesRead.EnableWindow(FALSE);
  256.         m_cFilesWrite.EnableWindow(FALSE);
  257.         m_cFilesDelete.EnableWindow(FALSE);
  258.         m_cFilesAppend.EnableWindow(FALSE);
  259.         m_cDirsCreate.EnableWindow(FALSE);
  260.         m_cDirsDelete.EnableWindow(FALSE);
  261.         m_cDirsList.EnableWindow(FALSE);
  262.         m_cDirsSubdirs.EnableWindow(FALSE);
  263.         m_cAutoCreate.EnableWindow(FALSE);
  264.         GetDlgItem(IDC_DIRADD)->EnableWindow(FALSE);
  265.         GetDlgItem(IDC_DIRREMOVE)->EnableWindow(FALSE);
  266.         GetDlgItem(IDC_DIRRENAME)->EnableWindow(FALSE);
  267.         GetDlgItem(IDC_DIRSETASHOME)->EnableWindow(FALSE);
  268.  
  269.         m_bFilesAppend = m_bFilesDelete = m_bFilesRead = m_bFilesWrite = FALSE;
  270.         m_bDirsCreate = m_bDirsDelete = m_bDirsList = m_bDirsSubdirs = FALSE;
  271.         m_bAutoCreate = FALSE;
  272.         UpdateData(FALSE);
  273.     }
  274.     else
  275.     {
  276.         m_cDirs.EnableWindow(TRUE);
  277.         GetDlgItem(IDC_DIRADD)->EnableWindow(TRUE);
  278.         
  279.         if (m_cDirs.GetFirstSelectedItemPosition())
  280.         {
  281.             m_cFilesRead.EnableWindow(TRUE);
  282.             m_cFilesWrite.EnableWindow(TRUE);
  283.             m_cFilesDelete.EnableWindow(TRUE);
  284.             if (m_bFilesWrite)
  285.                 m_cFilesAppend.EnableWindow(TRUE);
  286.             else
  287.                 m_cFilesAppend.EnableWindow(FALSE);
  288.             m_cDirsCreate.EnableWindow(TRUE);
  289.             m_cDirsDelete.EnableWindow(TRUE);
  290.             m_cDirsList.EnableWindow(TRUE);
  291.             m_cDirsSubdirs.EnableWindow(TRUE);
  292.             m_cAutoCreate.EnableWindow(TRUE);
  293.             GetDlgItem(IDC_DIRREMOVE)->EnableWindow(TRUE);
  294.             GetDlgItem(IDC_DIRRENAME)->EnableWindow(TRUE);
  295.             GetDlgItem(IDC_DIRSETASHOME)->EnableWindow(TRUE);
  296.         }
  297.         else
  298.         {
  299.             m_bFilesAppend = m_bFilesDelete = m_bFilesRead = m_bFilesWrite = FALSE;
  300.             m_bDirsCreate = m_bDirsDelete = m_bDirsList = m_bDirsSubdirs = FALSE;
  301.             m_bAutoCreate = FALSE;
  302.             UpdateData(FALSE);
  303.             m_cFilesRead.EnableWindow(FALSE);
  304.             m_cFilesWrite.EnableWindow(FALSE);
  305.             m_cFilesDelete.EnableWindow(FALSE);
  306.             m_cFilesAppend.EnableWindow(FALSE);
  307.             m_cDirsCreate.EnableWindow(FALSE);
  308.             m_cDirsDelete.EnableWindow(FALSE);
  309.             m_cDirsList.EnableWindow(FALSE);
  310.             m_cDirsSubdirs.EnableWindow(FALSE);
  311.             m_cAutoCreate.EnableWindow(FALSE);
  312.             GetDlgItem(IDC_DIRREMOVE)->EnableWindow(FALSE);
  313.             GetDlgItem(IDC_DIRRENAME)->EnableWindow(FALSE);
  314.             GetDlgItem(IDC_DIRSETASHOME)->EnableWindow(FALSE);
  315.         }
  316.     }
  317. }
  318.  
  319. void CGroupsDlgSharedFolders::OnDirmenuAdd() 
  320. {
  321.     t_group *pGroup = m_pOwner->GetCurrentGroup();
  322.     if (!pGroup)
  323.         return;
  324.  
  325.     t_directory dir;
  326.     dir.bFileRead = dir.bDirList = dir.bDirSubdirs = TRUE;
  327.     dir.bDirCreate = dir.bDirDelete = 
  328.         dir.bFileAppend = dir.bFileDelete = 
  329.         dir.bFileWrite = dir.bIsHome =
  330.         dir.bAutoCreate = FALSE;
  331.     dir.dir = _T("");
  332.     dir.bIsHome = m_cDirs.GetItemCount()?FALSE:TRUE;
  333.  
  334.     pGroup->permissions.push_back(dir);
  335.     int nItem = m_cDirs.InsertItem(LVIF_TEXT |LVIF_PARAM|LVIF_IMAGE, 0, _T("<new directory>"), 0, 0, dir.bIsHome?1:0, pGroup->permissions.size()-1);
  336.     m_cDirs.SetItemState(nItem, LVIS_SELECTED,LVIS_SELECTED);
  337.     m_cDirs.SetItemState(nItem, LVIS_SELECTED,LVIS_SELECTED);
  338.     OnDblclkDirs(0, 0);    
  339. }
  340.  
  341. void CGroupsDlgSharedFolders::OnDirmenuRemove() 
  342. {
  343. t_group *pGroup = m_pOwner->GetCurrentGroup();
  344.     if (!pGroup)
  345.         return;
  346.     
  347.     POSITION selpos;
  348.     selpos=m_cDirs.GetFirstSelectedItemPosition();
  349.     if (!selpos)
  350.         return;
  351.     int nItem=m_cDirs.GetNextSelectedItem(selpos);
  352.     int index=m_cDirs.GetItemData(nItem);
  353.     m_cDirs.DeleteItem(nItem);
  354.     int i=0;
  355.     for (std::vector<t_directory>::iterator iter=pGroup->permissions.begin(); iter != pGroup->permissions.end(); iter++, i++)
  356.         if (i==index)
  357.         {
  358.             pGroup->permissions.erase(iter);
  359.             break;
  360.         }
  361.     for (i = 0; i < m_cDirs.GetItemCount(); i++)
  362.     {
  363.         int data = m_cDirs.GetItemData(i);
  364.         if (data > index)
  365.         {
  366.             m_cDirs.SetItemData(i, data - 1);
  367.         }
  368.     }
  369.     SetCtrlState();
  370. }
  371.  
  372. void CGroupsDlgSharedFolders::OnDirmenuRename() 
  373. {
  374.     t_group *pGroup = m_pOwner->GetCurrentGroup();
  375.     if (!pGroup)
  376.         return;
  377.     
  378.     POSITION selpos = m_cDirs.GetFirstSelectedItemPosition();
  379.     if (!selpos)
  380.         return;
  381.     int nItem = m_cDirs.GetNextSelectedItem(selpos);
  382.     
  383.     m_cDirs.SetFocus();
  384.     m_cDirs.EditLabel(nItem);
  385. }
  386.  
  387. void CGroupsDlgSharedFolders::OnDirmenuSetashomedir() 
  388. {
  389.     t_group *pGroup = m_pOwner->GetCurrentGroup();
  390.     if (!pGroup)
  391.         return;
  392.     
  393.     POSITION selpos;
  394.     selpos=m_cDirs.GetFirstSelectedItemPosition();
  395.     if (!selpos)
  396.         return;
  397.     int nItem=m_cDirs.GetNextSelectedItem(selpos);
  398.     
  399.     for (unsigned int j=0; j<pGroup->permissions.size(); j++)
  400.     {
  401.         LVITEM item;
  402.         memset(&item,0,sizeof(item));
  403.         item.mask=LVIF_IMAGE|LVIF_PARAM;
  404.         item.iItem=j;
  405.         m_cDirs.GetItem(&item);
  406.         item.iImage = (j==(unsigned int)nItem)?1:0;
  407.         pGroup->permissions[item.lParam].bIsHome=0;
  408.         m_cDirs.SetItem(&item);
  409.     }
  410.     int index = m_cDirs.GetItemData(nItem);
  411.     pGroup->permissions[index].bIsHome = 1;
  412. }
  413.  
  414. void CGroupsDlgSharedFolders::OnEndlabeleditDirs(NMHDR* pNMHDR, LRESULT* pResult) 
  415. {
  416.     LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
  417.     if (pDispInfo->item.pszText)
  418.     {
  419.         if (pDispInfo->item.pszText[0] == 0)
  420.         {
  421.             AfxMessageBox(_T("Please select a folder!"));
  422.             *pResult = FALSE;
  423.         }
  424.         else
  425.         {
  426.             t_group *pGroup = m_pOwner->GetCurrentGroup();
  427.             if (!pGroup)
  428.                 return;
  429.                         
  430.             pGroup->permissions[pDispInfo->item.lParam].dir = pDispInfo->item.pszText;
  431.             *pResult = TRUE;
  432.         }
  433.     
  434.     }
  435.     else
  436.     {
  437.         if (m_cDirs.GetItemText(pDispInfo->item.iItem,0) == _T(""))
  438.         {
  439.             t_group *pGroup = m_pOwner->GetCurrentGroup();
  440.             if (!pGroup)
  441.                 return;
  442.             
  443.             m_cDirs.DeleteItem(pDispInfo->item.iItem);
  444.             int i=0;
  445.             for (std::vector<t_directory>::iterator iter=pGroup->permissions.begin(); iter!=pGroup->permissions.end(); iter++, i++)
  446.                 if (i==pDispInfo->item.lParam)
  447.                 {
  448.                     pGroup->permissions.erase(iter);
  449.                     break;
  450.                 }
  451.         }
  452.     }
  453. }
  454.  
  455. void CGroupsDlgSharedFolders::OnDblclkDirs(NMHDR* pNMHDR, LRESULT* pResult) 
  456. {
  457.     t_group *pGroup = m_pOwner->GetCurrentGroup();
  458.     if (!pGroup)
  459.         return;
  460.     
  461.     NMITEMACTIVATE *pItemActivate = (NMITEMACTIVATE *)pNMHDR;
  462.  
  463.     POSITION selpos = m_cDirs.GetFirstSelectedItemPosition();
  464.     if (!selpos)
  465.         return;
  466.     int nItem = m_cDirs.GetNextSelectedItem(selpos);
  467.     int index = m_cDirs.GetItemData(nItem);
  468.  
  469.     if (!pItemActivate || !pItemActivate->iSubItem)
  470.     {
  471.         if (m_pOwner->IsLocalConnection())
  472.         {
  473.             CSBDestination sb(m_hWnd, IDS_BROWSEFORFOLDER);
  474.             sb.SetFlags(BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT);
  475.             sb.SetInitialSelection(m_cDirs.GetItemText(nItem,0));
  476.             if (sb.SelectFolder())
  477.             {
  478.                 m_cDirs.SetItemText(nItem, 0, sb.GetSelectedFolder());
  479.                 pGroup->permissions[index].dir = sb.GetSelectedFolder();
  480.             }
  481.         }
  482.         else
  483.         {
  484.             m_cDirs.SetFocus();
  485.             m_cDirs.EditLabel(nItem);
  486.         }
  487.     }
  488.     else
  489.         OnDirmenuEditAliases();
  490.     
  491.     if (pResult)
  492.         *pResult = 0;
  493. }
  494.  
  495. void CGroupsDlgSharedFolders::OnFilesWrite() 
  496. {
  497.     UpdateData(TRUE);
  498.     SetCtrlState();    
  499. }
  500.  
  501. void CGroupsDlgSharedFolders::OnDiradd() 
  502. {
  503.     OnDirmenuAdd();    
  504. }
  505.  
  506. void CGroupsDlgSharedFolders::OnDirremove() 
  507. {
  508.     OnDirmenuRemove();    
  509. }
  510.  
  511. void CGroupsDlgSharedFolders::OnDirrename() 
  512. {
  513.     OnDirmenuRename();    
  514. }
  515.  
  516. void CGroupsDlgSharedFolders::OnDirsetashome() 
  517. {
  518.     OnDirmenuSetashomedir();    
  519. }
  520.  
  521. BOOL CGroupsDlgSharedFolders::PreTranslateMessage(MSG* pMsg) 
  522. {
  523.     if (pMsg->message == WM_KEYDOWN)
  524.     {
  525.         if (pMsg->wParam == VK_F2)
  526.         {
  527.             if (GetFocus() == &m_cDirs)
  528.             {
  529.                 if (m_cDirs.GetEditControl())
  530.                     return TRUE;
  531.                 OnDirmenuRename();
  532.             }
  533.             return TRUE;
  534.         }
  535.     }
  536.     return CSAPrefsSubDlg::PreTranslateMessage(pMsg);
  537. }
  538.  
  539. BOOL CGroupsDlgSharedFolders::DisplayGroup(const t_group *pGroup)
  540. {
  541.     if (!pGroup)
  542.     {
  543.         m_cDirs.DeleteAllItems();
  544.         m_bFilesRead = m_bFilesWrite = m_bFilesDelete = m_bFilesAppend = FALSE;
  545.         m_bDirsCreate = m_bDirsList = m_bDirsDelete = m_bDirsSubdirs = FALSE;
  546.         m_bAutoCreate = FALSE;
  547.         return TRUE;
  548.     }
  549.     
  550.     UpdateData(FALSE);
  551.     
  552.     //Fill the dirs list
  553.     m_cDirs.DeleteAllItems();
  554.     for (unsigned int j = 0; j < pGroup->permissions.size(); j++)
  555.     {
  556.         int nItem = m_cDirs.InsertItem(j, pGroup->permissions[j].dir);
  557.         LVITEM item;
  558.         memset(&item, 0, sizeof(item));
  559.         item.mask=LVIF_IMAGE|LVIF_PARAM;
  560.         item.iItem = nItem;
  561.         m_cDirs.GetItem(&item);
  562.         item.lParam=j;
  563.         item.iImage = pGroup->permissions[j].bIsHome?1:0;
  564.         m_cDirs.SetItem(&item);
  565.  
  566.         CString aliases;
  567.         for (std::list<CString>::const_iterator iter = pGroup->permissions[j].aliases.begin(); iter != pGroup->permissions[j].aliases.end(); iter++)
  568.             aliases += *iter + _T("|");
  569.         aliases.TrimRight('|');
  570.         m_cDirs.SetItemText(nItem, 1, aliases);
  571.     }
  572.  
  573.     return TRUE;
  574. }
  575.  
  576. BOOL CGroupsDlgSharedFolders::SaveGroup(t_group *pGroup)
  577. {
  578.     if (!pGroup)
  579.         return FALSE;
  580.         
  581.     POSITION selpos = m_cDirs.GetFirstSelectedItemPosition();
  582.     if (selpos)
  583.     {
  584.         int item = m_cDirs.GetNextSelectedItem(selpos);
  585.         int index = m_cDirs.GetItemData(item);
  586.         pGroup->permissions[index].bFileRead = m_bFilesRead;
  587.         pGroup->permissions[index].bFileWrite = m_bFilesWrite;
  588.         pGroup->permissions[index].bFileDelete = m_bFilesDelete;
  589.         pGroup->permissions[index].bFileAppend = m_bFilesAppend;
  590.         pGroup->permissions[index].bDirCreate = m_bDirsCreate;
  591.         pGroup->permissions[index].bDirDelete = m_bDirsDelete;
  592.         pGroup->permissions[index].bDirList = m_bDirsList;
  593.         pGroup->permissions[index].bDirSubdirs = m_bDirsSubdirs;
  594.         pGroup->permissions[index].bAutoCreate = m_bAutoCreate;
  595.     }        
  596.     return TRUE;
  597. }
  598.  
  599. void CGroupsDlgSharedFolders::OnDirmenuEditAliases()
  600. {
  601.     t_group *pGroup = m_pOwner->GetCurrentGroup();
  602.     if (!pGroup)
  603.         return;
  604.     
  605.     POSITION selpos = m_cDirs.GetFirstSelectedItemPosition();
  606.     if (!selpos)
  607.         return;
  608.     int nItem = m_cDirs.GetNextSelectedItem(selpos);
  609.     int index = m_cDirs.GetItemData(nItem);
  610.  
  611.     if (pGroup->permissions[index].bIsHome)
  612.     {
  613.         AfxMessageBox(_T("Can't set aliases for home dir, this would create a recursive directory structure."));
  614.         return;
  615.     }
  616.  
  617.     CEnterSomething dlg(IDS_SHAREDFOLDERS_ENTERALIASES, IDD_ENTERSOMETHING_LARGE);
  618.     dlg.m_String = m_cDirs.GetItemText(nItem, 1);
  619.     dlg.allowEmpty = true;
  620.     if (dlg.DoModal() == IDOK)
  621.     {
  622.         CString aliases = dlg.m_String;
  623.         while (aliases.Replace(_T("||"), _T("|")));
  624.         aliases.TrimLeft(_T("|"));
  625.         aliases.TrimRight(_T("|"));
  626.         m_cDirs.SetItemText(nItem, 1, aliases);
  627.         
  628.         pGroup->permissions[index].aliases.clear();
  629.         aliases += _T("|");
  630.         int pos;
  631.         do 
  632.         {
  633.             pos = aliases.Find(_T("|"));
  634.  
  635.             CString alias = aliases.Left(pos);
  636.             if (alias != _T(""))
  637.                 pGroup->permissions[index].aliases.push_back(alias);
  638.             aliases = aliases.Mid(pos + 1);
  639.         } while (pos != -1);
  640.     }
  641. }